package com.hsqyz.esp32_led.factory.frame;

import com.hsqyz.esp32_led.common.utils.SpringUtils;
import com.hsqyz.esp32_led.config.iot.IotConfig;
import com.hsqyz.esp32_led.model.dto.Esp32MessageDto;
import io.netty.handler.codec.EncoderException;
import lombok.extern.slf4j.Slf4j;

/**
 * 抽象帧编码器
 *
 * @param <T> 编码数据类型
 */
@Slf4j
public abstract class Esp32AbstractFrameEncoder<T> {

    public Esp32MessageDto tryEncode(T t) {
        Esp32MessageDto messageDto = new Esp32MessageDto();
        try {
            //  编译数据
            messageDto = encode(t);
            // 打印日志
            IotConfig iotConfig = SpringUtils.getBean(IotConfig.class);
            if (iotConfig.isEnableLogging()) {
                log.info("Frame{},编译结果:{}", messageDto.getCmd(), messageDto);
            }
        } catch (EncoderException e) {
            log.error("Frame编码异常: {}", e.getMessage());
        }
        return messageDto;
    }

    public abstract Esp32MessageDto encode(T t) throws EncoderException;

}
